package xyz.jangle.stream;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
 * java 8 Stream 基本用法
 * @author Administrator
 *
 */
public class MainTestAll {

	public static void main(String[] args) {

		List<String> list = new ArrayList<String>();
		list.add("AA11");
		list.add("CC33");
		list.add("BB22");
		list.add("DD44");
		list.add("EE55");
		// 1. 过滤（Filtering） 使用 filter 方法可以轻松地从集合中筛选出满足特定条件的元素。
		List<String> collect = list.stream().filter(p -> p.startsWith("A")).collect(Collectors.toList());
		collect.forEach(a -> System.out.println(a));
		
		// 2. 映射（Mapping）	map 方法可以将流中的每个元素转换或映射为另一个元素。
		List<Integer> collect2 = list.stream().map(String::length).collect(Collectors.toList());
//		List<Integer> collect2 = list.stream().map(p -> p.length()).collect(Collectors.toList());
		collect2.forEach(a -> System.out.println(a));
		
		//3. 排序（Sorting）	使用 sorted 方法可以对流中的元素进行排序。
		System.out.println("排序前：");
		list.stream().forEach(a -> System.out.println(a));
		List<String> collect3 = list.stream().sorted().collect(Collectors.toList());
		System.out.println("****************");
		System.out.println("排序后");
		collect3.stream().forEach(a -> System.out.println(a));
		
		//4. 匹配（Matching） anyMatch, allMatch, 和 noneMatch 方法用于检查流中的元素是否匹配给定的条件。
		boolean anyMatch = list.stream().anyMatch(p -> p.startsWith("A"));
		System.out.println("存在任意元素，该元素以A开头："+anyMatch);
		boolean allMatch = list.stream().allMatch(p -> p.length() ==4);
		System.out.println("所有元素的长度=4："+allMatch);
		boolean noneMatch = list.stream().noneMatch(p -> p.startsWith("P"));
		System.out.println("没有任意元素是以P开头的："+noneMatch);
		
		List<Integer> list2 = new ArrayList<Integer>();
		list2.add(1);
		list2.add(2);
		list2.add(3);
		list2.add(4);
		
		
		//5.归约（Reduction）reduce 方法可以将流中的元素归约成一个值，如求和、求积等。
		Integer sum = list2.stream().reduce(0,Integer::sum);
		System.out.println("规约："+sum);
		//6.收集流
		List<Integer> collect4 = list2.stream().collect(Collectors.toList());
		System.out.println("收集流："+collect4.size());
		//7.数值流 可以使用 IntStream, LongStream, DoubleStream 来处理原始数值类型的数据。
		IntStream intStream = list.stream().mapToInt(String::length);
		int sum2 = intStream.sum();
		System.out.println("数值流"+sum2);
		
		
	}

}
